"""
该模块包含校长相关的视图函数，用于展示和管理学校信息。
"""
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from core.models.classinfo import ClassInfo
from core.models.role import Role
from django.db.models import Count, Sum
from core.models import Grade, Student, ClassEvaluation, DisciplineRecord, HonorRecord

class PrincipalDashboardView(LoginRequiredMixin, ListView):
    """
    校长仪表盘视图

    展示学校的整体信息，仅对校长角色可见。

    Attributes:
        model: 使用的模型类为Grade
        template_name: 渲染的模板文件路径
        context_object_name: 传递给模板的上下文变量名
    """
    model = Grade
    template_name = 'principal/dashboard.html'
    context_object_name = 'grades'
    paginate_by = 10  # 每页显示10条记录

    def get_queryset(self):
        """
        获取学校所有年级的查询集

        验证用户角色是否为校长，如果不是则返回空查询集。
        如果是校长，则返回学校的所有年级。

        :return: 年级查询集
        :rtype: django.db.models.QuerySet
        """
        current_role = self.request.session.get('CURRENT_ROLE')

        # 验证用户角色为校长
        if current_role != Role.PRINCIPAL:
            return Grade.objects.none()

        # 返回学校的所有年级
        # 使用annotate添加班级数量和学生数量
        return Grade.objects.all().annotate(
            class_count=Count('classes'),
            student_count=Count('classes__enrolled_students', distinct=True)
        ).order_by('name')

    def get_context_data(self, **kwargs):
        """
        添加额外的上下文数据

        除了默认的上下文数据外，还添加学校整体统计信息到上下文中。

        :param kwargs: 关键字参数
        :type kwargs: dict
        :return: 上下文数据
        :rtype: dict
        """
        context = super().get_context_data(**kwargs)
        
        # 无论是否有年级数据，都设置统计信息
        context['grade_count'] = self.object_list.count()
        context['class_count'] = ClassInfo.objects.all().count()
        context['student_count'] = Student.objects.all().count()

        # 评价统计
        eval_stats = ClassEvaluation.objects.all().values('evaluation').annotate(count=Count('id'))
        stats_dict = {item['evaluation']: item['count'] for item in eval_stats}
        context['evaluation_stats'] = {
            'good': stats_dict.get('good', 0),
            'medium': stats_dict.get('medium', 0),
            'poor': stats_dict.get('poor', 0)
        }

        # 纪律统计
        context['discipline_count'] = DisciplineRecord.objects.all().count()

        # 荣誉统计
        context['honor_count'] = HonorRecord.objects.all().count()
        
        return context